package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup
var golnum int

// 加入互斥锁
var lock sync.Mutex
var rwlock sync.RWMutex

func read() {
	defer wg.Done()
	rwlock.RLock()
	fmt.Println("正在读取数据")
	time.Sleep(time.Second)
	fmt.Println("读取数据成功")
	rwlock.RUnlock()
}

func write() {
	defer wg.Done()
	rwlock.Lock()
	fmt.Println("正在写入数据")
	time.Sleep(time.Second * 5)
	fmt.Println("写入数据结束")
	rwlock.Unlock()
}

func main() {
	wg.Add(11)

	for i := 0; i < 10; i++ {
		go read()
	}
	go write()

	wg.Wait()
}

//func add() {
//	defer wg.Done()
//	for i := 0; i < 100000; i++ {
//		// 加锁
//		lock.Lock()
//		golnum++
//		// 解锁
//		lock.Unlock()
//	}
//}
//
//func sub() {
//	defer wg.Done()
//	for i := 0; i < 100000; i++ {
//		// 加锁
//		lock.Lock()
//		golnum--
//		// 解锁
//		lock.Unlock()
//	}
//}
//
//func main() {
//	wg.Add(2)
//	go add()
//	go sub()
//	wg.Wait()
//
//	fmt.Printf("这是主线程要执行的......最后golnum = %d\n", golnum)
//}

//func add() {
//	defer wg.Done()
//	for i := 0; i < 100000; i++ {
//		golnum++
//	}
//}
//
//func sub() {
//	defer wg.Done()
//	for i := 0; i < 100000; i++ {
//		golnum--
//	}
//}
//
//func main() {
//	wg.Add(2)
//	go add()
//	go sub()
//	wg.Wait()
//
//	fmt.Printf("这是主线程要执行的......最后golnum = %d\n", golnum)
//}

//func add() {
//	defer wg.Done()
//	for i := 0; i < 100000; i++ {
//		golnum++
//	}
//}
//
//func main() {
//	wg.Add(1)
//	go add()
//	wg.Wait()
//
//	fmt.Printf("这是主线程要执行的......最后golnum = %d\n", golnum)
//}

//func main() {
//	for i := 1; i <= 5; i++ {
//		wg.Add(1) // 加1
//		go func(n int) {
//			// defer wg.Done 也可以
//			fmt.Println(n)
//			wg.Done() // 减1
//		}(i)
//	}
//
//	wg.Wait()
//}
